#ifndef CONTROL_H
#define CONTROL_H

#include "camera.h"
#include <GLFW/glfw3.h>
#include <glm/glm.hpp>
#include <memory>

// 数值限制，避免nan
constexpr float THRESHOLD = 0.5;

class Control {
public:
    Control(
        GLFWwindow* window,
        std::shared_ptr<Camera> camera,
        std::shared_ptr<Object> center,
        const float radius);

    void update();

private:

    // 更新局部方向，右上方为正方向
    void turn(float x_diff, float y_diff);
    // 更新极坐标
    void move(glm::vec2 move_direction);
    // 根据局部坐标系更新相机
    void update_camera();
    // 根据中心和经纬计算位置
    glm::vec3 get_view_position() const;
    // 鼠标之前位置
    double x_pre;
    double y_pre;

    const float VIEW_RADIUS=1000;

    // 第一人称相对星球中心的位置
    glm::vec3 center_to_camera=glm::vec3(0,1,0);
    // 第一人称相机视角方向（全局）
    glm::vec3 view_direction=glm::vec3(0,0,1);

    float radius;
    
    GLFWwindow* window;
    std::shared_ptr<Camera> camera;
    std::shared_ptr<Object> center;

    // 这个是角速度
    float speed=0.01;

    const float PI = glm::pi<float>();
};

// 绕单位向量 n 按右手方向旋转 v ，弧度为 t
glm::vec3 rotate_vector(glm::vec3 v, glm::vec3 n, float t);

#endif